<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 12题 -->
    <ul id="list">
        <li>百度</li>
        <li>阿里</li>
        <li>腾讯</li>
    </ul>
</body>
<script>
    // 1、以下代码输出的结果是：
    //解析: 
    //结果: undefined 原因: 没有定义
    // var foo = function bar() { }
    // console.log(typeof bar);

    // 2、以下代码输出结果是：
    //解析：
    //当 a 出现在 if 的条件中时，被转成布尔值，而 Boolean([0]) 为 true
    //所以就进行下一步判断 a == true，true被转为1 ，1 和 a 不相等
    //相等和不相等-- - 先转换在比较。全等和不全等-- - 仅比较而不转换
    //相等 == 和不相等 != 这两个操作符都会先转换操作数（通常称为强制转型），然后再比较他们的相等性。
    //在转换不同的数据类型时，相等和不相等操作符遵循下列基本规则：
    //如果由一个操作数是布尔值，则在比较相等性之前先将其转换为数值-- - false转换为0，而true转换为1；
    //如果一个操作数是字符串，另一个操作数是数值，在比较相等性之前先将字符串转换为数值；
    //如果一个操作数是对象，另一个操作数不是，则调用对象的valueOf（）方法，用得到的基本类型值按照前面的规则进行比较；

    // var a = 1;
    // if (true) {
    //     console.log(a);
    //     let a = 2;
    // }

    // 3、以下代码输出的结果是：
    //解析:
    //结果: 9 原因: new Set 去除重复的值之后的大小
    // var a = [1, 2, 3, 3, 5, 6, 6, 6, 'A', undefined, true, null]
    // var s = new Set(a);
    // console.log(s.size);

    //4、请你写出代码，计算两个数组的交集：

    // let arr1 = [1, 2, 3, 4, 5];
    // let arr2 = [4, 5, 6, 7, 8];
    // let set1 = new Set(arr1), set2 = new Set(arr2);
    // //交集
    // let intersection = arr1.filter(item => set2.has(item));
    // console.log("交集", intersection);

    //5、以下代码运行后，在控制台里打印输出的内容为：

    // let x = 1;
    // function f1(x, y = x) {
    //     console.log(y);//undefined
    // }
    // function f2(y = x) {
    //     let x = 0;
    //     console.log(y); //2
    // }
    // f2(2);
    // f1();
    // //6、以下代码运行后，在控制台里打印输出的内容为：
    // fn(123)
    // var a = 456;
    // function fn(a) {
    //     console.log(a); //123
    // }

    //7、eadonly和disabled哪个属性对input和textarea元素都生效？
    //A readonly
    //B disabled

    //1.两种情况的写法，没什么太大的区别，两个属性而已
    //disabled写法：<input type="text" name="aaa" value="xxx" disabled="true" />
    //readonly写法：  <input type="text" name="bbb" value="xxx" readonly="true" />

    //2.两种写法的相同点：
    //都会使文本框变成只读，不可编辑
    //不同点：
    //1.disabled属性在将input文本框变成只读不可编辑的同时，还会使文本框变灰，但是readonly不会。
    //2.disabled属性修饰后的文本框内容，在不可编辑的同时，通过js也是获取不到的。例如$("input [name='aaa']").val()是不好用的。
    //但是用readonly修饰后的文本框内容，是可以通过js获取到的，也就只是简单的不可编辑而已！
    //3.disabled属性对input文本框，单选radio, 多选checkbox都适用，但是readonly就不适用，用它修饰后的单选以及多选按钮仍然是可以编辑状态的。

    //8、以下代码输出结果为：_________，并详细说明原因：
    // function F() {
    //     this.a = 1;//此时this指向Window，Window里面没有a参数，所以为undefined
    // }
    // var obj = new F();
    // console.log(obj.prototype);

    //9、以下代码输出的结果为：
    // if (false) {
    //     var a = 1;
    //     let b = 2;
    // }
    // console.log(a);//undefined
    // console.log(b);//未捕获引用错误：未定义b

    //10、请写出代码，计算两个数组的差集：
    // let arr1 = [1, 2, 3, 4, 5];
    // let arr2 = [4, 5, 6, 7, 8]
    // let set1=new Set(arr1),set2=new Set(arr2);
    // //差集 数组arr1相对于arr2所没有的
    // let diff = arr1.filter(item => set2.has(item) == false);
    // console.log("差集", diff);

    //11、a、b、c、的值分别为：
    // var [a=3,b=a,c=3]=[1,2,undefined];
    // console.log([a=3,b=a,c=3]=[1,2,undefined]);

    //12、以下代码运行后，ul里的内容顺序为：
    var list = document.getElementById('list');
    var lis = list.querySelectorAll('li');
    list.replaceChild(lis[2], lis[1]);
    list.insertBefore(lis[1], list.children[2]);

    //13、以下代码执行后，控制台里打印的内容为：
    // var c = 1;
    // function c() {
    //     console.log(c);//未捕获TypeError:c不是函数
    //     var c = 3;
    // }
    // console.log(c);
    // c(2);

    //14、以下代码执行后，控制台里打印的内容为：
    // var name = 'kaivan';
    // (function () {
    //     if (typeof name === 'undefined') {
    //         var name = 'chen';
    //         console.log(name);
    //     } else {
    //         console.log(name);
    //     }
    // })();

    //15、以下代码执行后，控制台里打印的内容为：
    // var a = 10;
    // function test() {
    //     a = 100;
    //     console.log(a);//100
    //     console.log(this.a);//10
    //     var a;
    //     console.log(a);//100
    // }
    // test();

    //16、以下代码执行后，控制台里打印出的内容为：
    //解析:
    //那么题目的意思就是：首先声明a，然后判断a是否在存在，如果不存在就赋值为1，
    //很明显a永远在window里存在，这个赋值语 句永远不会执行，所以结果是undefined
    // if (!('a' in window)) {
    //     var a = 1;
    // }
    // console.log(a);

    //17、以下代码执行后，控制台里打印的内容为：
    // var val = 1;
    // var obj = {
    //     val: 2,
    //     del: function () {
    //         console.log(this);//this指定的window；
    //         this.val *= 2;//    window的val被赋值为2*2（2是val全局下的值）   最后的结果是val被赋值了4
    //         console.log(val);//（全局下的val）     所以结果是1
    //     }
    // }
    // obj.del();//1   

    //18、以下代码执行后，控制台里打印出的内容为：
    // var name = 'kaivon';
    // var object = {
    //     name: 'chen',
    //     getNameFunc: function () {
    //         return function () {
    //             return this.name;
    //         }
    //     }
    // }
    // console.log(object.getNameFunc()()) //kaivon

    //19、以下代码执行后，控制台里打印的内容为：
    //解析:
    //object.getNameFunc()返回一个匿名函数,在全局环境调用该函数，this指向的全局对象
    //将匿名函数外部作用域中this对象保存在闭包能够访问到的变量中
    // var name = 'kaivon';
    // var object = {
    //     name: 'chen',
    //     getNameFunc: function () {
    //         var that = this;
    //         return function () {
    //             return that.name;
    //         }
    //     }
    // }
    // console.log(object.getNameFunc()())//kaivon

    //20、以下代码执行后，控制台里打印的内容为：
    // var a = 6;
    // setTimeout(function () {
    //     a = 666;
    // }, 0)
    // console.log(a);//6

    //21、以下的代码执行后，控制台里打印的内容为：
    // (function () {
    //     var a = b = 3;
    // })();
    // console.log(typeof a === 'undefined');
    // console.log(typeof b === 'undefined')

    //22、以下的代码执行后，控制台里打印的内容为：
    // var a = (function (foo) {
    //     return typeof foo.bar;
    // })({ foo: { bar: 1 } });
    // console.log(a);

    //23、以下的代码执行后，控制台里打印的内容为：
    // function f() {
    //     return f;
    // }
    // console.log(new f() instanceof f);

    //24、以下的代码执行后，控制台里打印的内容为：
    // function A() { }
    // A.prototype.n = 1;
    // var b = new A();
    // A.prototype = {
    //     n: 2,
    //     m: 3,
    // }
    // var c = new A();
    // console.log(b.n, b.m);
    // console.log(c.n, c.m)

    //25、以下的代码执行后，控制台里打印的内容为：
    // function A() { }
    // A.prototype.n = 1;
    // var b = new A();
    // A.prototype = {
    //     n: 2,
    //     m: 3,
    // }
    // var c = new A();
    // console.log(b.n, b.m);
    // console.log(c.n, c.m)

    //26、以下的代码执行后，控制台里打印的内容为：
    // console.log(1 + '2' + '2');
    // console.log(1 + +'2' + '2');
    // console.log(+ '1' - +'1' + '2');
    // console.log('A' - 'B' + '2');
    // console.log('A' - 'B' + 2)

    //27、以下的代码执行后，控制台里打印的内容为：
    // var a = 666;
    // console.log(++a);
    // console.log(a++);
    // console.log(a);

    //28、以下的代码执行后，控制台里打印的内容为：
    // var a = 666;
    // console.log(++a);
    // console.log(a++);
    // console.log(a);

    //29、以下的代码执行后，控制台里打印的内容为：
    // var a = 666;
    // console.log(++a);
    // console.log(a++);
    // console.log(a);

    //30、以下的代码执行后，控制台里打印的内容为：
    // console.log(typeof a);
    // function a() { };
    // var a;
    // console.log(typeof a);


</script>

</html>